home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 39 / Amiga Format CD39 (1999-04-13)(Future Publishing)(GB)[!][issue 1999-05].iso / -seriously_amiga- / graphics / ripley / source / yuvconversion.c < prev    next >
C/C++ Source or Header  |  1999-03-02  |  3KB  |  162 lines

  1.  
  2. #include "yuvconversion.h"
  3. #include <exec/types.h>
  4.  
  5.  
  6. static unsigned short cliptab[256*3];
  7. static unsigned short *clipp;
  8.  
  9. void inityuv2rgb(void)
  10. {
  11.     int i;
  12.     unsigned short *cp = cliptab;
  13.  
  14.     clipp = &cliptab[256];
  15.     
  16.     for (i = -256; i < 512; ++i)
  17.     {
  18.         *cp++ = i < 0 ? 0 : (i > 255 ? 255 : i);
  19.     }
  20. }
  21.  
  22.  
  23.  
  24. void yuv2rgb(unsigned char **srcbuffer, ULONG *rgbp, int w, int h, int br)
  25. {
  26.     int x, y;
  27.     unsigned char *py1, *py2, *pu, *pv;
  28.  
  29.     int t0, t1, t2, t3;
  30.     int u, v, vt0, ut1, utx;
  31.     ULONG *rgbp1, *rgbp2;
  32.     
  33.     rgbp1 = rgbp;
  34.     rgbp2 = rgbp + w;
  35.     
  36.     py1 = srcbuffer[0];
  37.     pu = srcbuffer[1];
  38.     pv = srcbuffer[2];
  39.     
  40.     py2 = py1 + w;
  41.     
  42.     br -= 16;
  43.     
  44.     for (y = 0; y < h/2; ++y)
  45.     {
  46.         for (x = 0; x < w/2; ++x)
  47.         {
  48.             t0 = (*py1++ + br) * 298;
  49.             t1 = (*py1++ + br) * 298;
  50.             t2 = (*py2++ + br) * 298;
  51.             t3 = (*py2++ + br) * 298;
  52.  
  53.             u = *pu++ - 128;
  54.             v = *pv++ - 128;
  55.  
  56.             vt0 = v * 409;
  57.             ut1 = u * 516;
  58.             utx = u * -100 + v * -208;
  59.  
  60.             *rgbp1++ =     (clipp[(t0 + vt0) >> 8] << 16) +
  61.                         (clipp[(t0 + utx) >> 8] << 8) +
  62.                          clipp[(t0 + ut1) >> 8];
  63.  
  64.             *rgbp1++ =     (clipp[(t1 + vt0) >> 8] << 16) +
  65.                         (clipp[(t1 + utx) >> 8] << 8) +
  66.                          clipp[(t1 + ut1) >> 8];
  67.  
  68.             *rgbp2++ =     (clipp[(t2 + vt0) >> 8] << 16) +
  69.                         (clipp[(t2 + utx) >> 8] << 8) +
  70.                          clipp[(t2 + ut1) >> 8];
  71.  
  72.             *rgbp2++ =     (clipp[(t3 + vt0) >> 8] << 16) +
  73.                         (clipp[(t3 + utx) >> 8] << 8) +
  74.                          clipp[(t3 + ut1) >> 8];
  75.  
  76.         }
  77.         py1 += w;
  78.         py2 += w;
  79.         rgbp1 += w;
  80.         rgbp2 += w;
  81.     }
  82. }
  83.  
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90.  
  91. #ifndef __PPC__
  92.  
  93. void yuv2rgbgrey(unsigned char **srcbuffer, ULONG *rgbp, int w, int h, int br)
  94. {
  95.     int i;
  96.     unsigned char *source;
  97.     unsigned char *dest;
  98.     unsigned char p;
  99.     
  100.     source = srcbuffer[0];
  101.     dest = (char *) rgbp;
  102.  
  103.     for (i=0; i < w*h; ++i)
  104.     {
  105.         p = clipp[*source++ + br];
  106.         *dest++= 0;
  107.         *dest++= p;
  108.         *dest++= p;
  109.         *dest++= p;
  110.     }
  111.  
  112. }
  113.  
  114. void yuv2pip(unsigned char *address ,unsigned char **srcbuffer, int x, int y, int br)
  115.  
  116. {
  117.              unsigned char *py, *pu, *pv, *puu, *pvv;
  118.              int i,yy,xx;
  119.  
  120.             py = srcbuffer[0];
  121.             pu = srcbuffer[1];
  122.             pv = srcbuffer[2];
  123.             y = y++;
  124.             x = x++;
  125.             
  126.                 for (yy = 0; yy < y+1; yy++)
  127.                 {
  128.                     for (i = 0; i < 2; i++)
  129.                     {
  130.                         puu = pu;
  131.                         pvv = pv;
  132.                         for(xx = 0; xx < x+1; xx++)
  133.                         {
  134.                             *address++ = *py++;
  135.                             *address++ = *puu++;
  136.                              *address++ = *py++;
  137.                              *address++ = *pvv++;
  138.                         }
  139.                     }
  140.                     pu = puu;
  141.                     pv = pvv;
  142.                 }
  143.  
  144. }
  145.  
  146.  
  147.  
  148. void yuv2pipgrey(unsigned char *address,unsigned char **scrbuffer, int y, int br)
  149. {
  150.     unsigned char *py = scrbuffer[0];
  151.     int yy;
  152.                  for (yy = 0; yy < y; yy++)
  153.  
  154.                         {
  155.                             *address++ = *py++;
  156.                             *address++ = 128;    
  157.                              *address++ = *py++;
  158.                              *address++ = 128;    
  159.                         }
  160.  
  161. }
  162. #endif